import { NestFactory } from '@nestjs/core';
import { AppModule } from '@/app.module';
import { HttpExceptionFilter } from '@/filter/http-exception.filter';
import { TransformInterceptor } from '@/filter/transform.interceptor';
import serveStatic from 'serve-static';
import path = require('path');
import Limit from 'express-rate-limit';
import { ConfigService } from '@nestjs/config';
// import express from 'express';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { mw as requestIpMw } from 'request-ip';
// import { loadConfig } from './config';
// import Chalk from 'chalk';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // express.json() : 将请求的body转换为json格式
  // app.use(express.json());
  // express.urlencoded({ extended: true }) : 将请求的body转换为urlencoded格式 浏览器不能识别汉字:
  // 让汉字转换成url编码
  // app.use(express.urlencoded({ extended: true }));
  // 这两种方案折中
  app.useGlobalFilters(new HttpExceptionFilter()); // 处理全局的错误
  app.useGlobalInterceptors(new TransformInterceptor()); // 处理统一的结果
  app.setGlobalPrefix('api/v1');
  app.enableCors(); // 处理跨域
  app.use(requestIpMw({ attributeName: 'ip' })); // 记录ip
  app.use(
    Limit({
      windowMs: 60 * 1000, // 15分钟
      max: 100, // 最大100个请求
    })
  ); // 处理限流
  /**
   * 配置文件
   */
  const config = app.get(ConfigService);
  // 获取配置文件
  const prefix = config.get<string>('app.prefix'); // /api/v1

  const port = config.get<string>('app.port'); // 4001
  const swaggerOption = new DocumentBuilder()
    .setTitle('学生信息管理系统')
    .setDescription('学生信息管理系统接口文档')
    .setVersion('1.0')
    .addBearerAuth()
    .build();
  const document = SwaggerModule.createDocument(app, swaggerOption);
  SwaggerModule.setup(`${prefix}/docs`, app, document, {
    swaggerOptions: {
      presetAuthorized: true,
    },
    customSiteTitle: '学生信息管理系统 API DOCS',
  });

  const publicPath = config.get<string>('app.publicPath'); // public
  app.use(
    `/${publicPath}`,
    serveStatic(path.join(__dirname, '../public'), {
      maxAge: '1d',
      extensions: ['jpg', 'jpeg', 'png', 'gif', 'txt'],
    })
  );
  await app.listen(port, () => {
    process.stdout.write(
      `服务启动成功，端口：${port}
静态资源目录：${publicPath}
限流规则：1分钟内最多100次
跨域规则：允许所有
路由前缀：${prefix}
服务器地址: http://localhost:${port}${prefix}
文档地址: http://localhost:${port}${prefix}/docs
`
    );
  });
}

bootstrap();
